#pragma once
#include "mysql.hpp"
#include "friend_apply.hxx"
#include "friend_apply-odb.hxx"

// 修改命名空间为 mag
namespace mag {

    // 定义 FriendApplyTable 类用于管理好友申请数据表操作
    class FriendApplyTable {
    public:
        // 定义指向 FriendApplyTable 的智能指针类型
        using ptr = std::shared_ptr<FriendApplyTable>;

        // 构造函数，接收数据库连接对象
        FriendApplyTable(const std::shared_ptr<odb::core::database> &db) : _db(db) {}

        // 插入新的好友申请事件
        bool insert(FriendApply &ev) {
            try {
                // 开始数据库事务
                odb::transaction trans(_db->begin());
                
                // 将 FriendApply 对象持久化到数据库
                _db->persist(ev);
                
                // 提交事务
                trans.commit();
            } catch (std::exception &e) {
                // 发生异常时记录错误信息
                LOG_ERROR("新增好友申请事件失败 {}-{}:{}！", ev.user_id(), ev.peer_id(), e.what());
                return false;
            }
            return true;
        }

        // 检查指定用户与目标用户之间是否已经有好友申请
        bool exists(const std::string &uid, const std::string &pid) {
            bool flag = false;
            try {
                // 定义查询条件
                typedef odb::query<FriendApply> query;
                typedef odb::result<FriendApply> result;

                // 开始数据库事务
                odb::transaction trans(_db->begin());

                // 查询是否存在符合条件的好友申请记录
                result r(_db->query<FriendApply>(query::user_id == uid && query::peer_id == pid));

                // 记录查询结果大小，判断是否存在此好友申请事件
                LOG_DEBUG("{} - {} 好友事件数量：{}", uid, pid, r.size());
                flag = !r.empty();

                // 提交事务
                trans.commit();
            } catch (std::exception &e) {
                // 发生异常时记录错误信息
                LOG_ERROR("获取好友申请事件失败:{}-{}-{}！", uid, pid, e.what());
            }
            return flag;
        }

        // 删除指定用户和目标用户之间的好友申请记录
        bool remove(const std::string &uid, const std::string &pid) {
            try {
                // 开始数据库事务
                odb::transaction trans(_db->begin());

                // 定义查询条件
                typedef odb::query<FriendApply> query;
                typedef odb::result<FriendApply> result;

                // 删除符合条件的好友申请记录
                _db->erase_query<FriendApply>(query::user_id == uid && query::peer_id == pid);

                // 提交事务
                trans.commit();
            } catch (std::exception &e) {
                // 发生异常时记录错误信息
                LOG_ERROR("删除好友申请事件失败 {}-{}:{}！", uid, pid, e.what());
                return false;
            }
            return true;
        }

        // 获取指定用户的所有好友申请者ID
        std::vector<std::string> applyUsers(const std::string &uid) {
            std::vector<std::string> res;
            try {
                // 开始数据库事务
                odb::transaction trans(_db->begin());

                // 定义查询条件
                typedef odb::query<FriendApply> query;
                typedef odb::result<FriendApply> result;

                // 查询所有目标用户（peer_id）为指定用户（uid）的好友申请记录
                result r(_db->query<FriendApply>(query::peer_id == uid));

                // 遍历查询结果并将申请者的 user_id 添加到结果数组
                for (result::iterator i(r.begin()); i != r.end(); ++i) {
                    res.push_back(i->user_id());
                }

                // 提交事务
                trans.commit();
            } catch (std::exception &e) {
                // 发生异常时记录错误信息
                LOG_ERROR("通过用户{}的好友申请者失败:{}！", uid, e.what());
            }
            return res;
        }

    private:
        // 存储数据库连接对象
        std::shared_ptr<odb::core::database> _db;
    };

}  // namespace mag
